package com.example.joblinker.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.joblinker.dto.CreateReplyDTO;
import com.example.joblinker.dto.CreateTopicDTO;
import com.example.joblinker.dto.ForumSearchDTO;
import com.example.joblinker.vo.BoardVO;
import com.example.joblinker.vo.ReplyVO;
import com.example.joblinker.vo.TopicVO;

import java.util.List;
import java.util.Map;

public interface ForumService {

    /**
     * 获取论坛统计数据
     * @return 统计数据
     */
    Map<String, Object> getForumStats();

    /**
     * 获取所有板块
     * @return 板块列表
     */
    List<BoardVO> getAllBoards();

    /**
     * 获取热门话题
     * @param limit 数量限制
     * @return 热门话题列表
     */
    List<TopicVO> getHotTopics(Integer limit);

    /**
     * 获取最新话题
     * @param page 页码
     * @param size 每页大小
     * @return 话题分页
     */
    Page<TopicVO> getLatestTopics(Integer page, Integer size);

    /**
     * 获取板块详情和话题列表
     * @param boardId 板块ID
     * @param page 页码
     * @param size 每页大小
     * @param filter 过滤条件（全部/热门/精华）
     * @param keyword 搜索关键词
     * @return 板块详情和话题列表
     */
    Map<String, Object> getBoardDetail(Long boardId, Integer page, Integer size, String filter, String keyword);

    /**
     * 获取话题详情
     * @param topicId 话题ID
     * @param userId 当前用户ID（可为null）
     * @return 话题详情
     */
    TopicVO getTopicDetail(Long topicId, Long userId);

    /**
     * 获取话题回复列表
     * @param topicId 话题ID
     * @param page 页码
     * @param size 每页大小
     * @param sort 排序方式（时间/热度）
     * @param userId 当前用户ID（可为null）
     * @return 回复分页
     */
    Page<ReplyVO> getTopicReplies(Long topicId, Integer page, Integer size, String sort, Long userId);

    /**
     * 创建话题
     * @param createTopicDTO 话题创建DTO
     * @param userId 用户ID
     * @return 创建的话题
     */
    TopicVO createTopic(CreateTopicDTO createTopicDTO, Long userId);

    /**
     * 更新话题
     * @param topicId 话题ID
     * @param updateTopicDTO 话题更新DTO
     * @param userId 用户ID
     * @return 更新后的话题
     */
    TopicVO updateTopic(Long topicId, CreateTopicDTO updateTopicDTO, Long userId);

    /**
     * 删除话题
     * @param topicId 话题ID
     * @param userId 用户ID
     * @return 是否删除成功
     */
    boolean deleteTopic(Long topicId, Long userId);

    /**
     * 创建回复
     * @param createReplyDTO 回复创建DTO
     * @param userId 用户ID
     * @return 创建的回复
     */
    ReplyVO createReply(CreateReplyDTO createReplyDTO, Long userId);

    /**
     * 删除回复
     * @param replyId 回复ID
     * @param userId 用户ID
     * @return 是否删除成功
     */
    boolean deleteReply(Long replyId, Long userId);

    /**
     * 话题投票（点赞/取消点赞）
     * @param topicId 话题ID
     * @param userId 用户ID
     * @param isUpvote 是否点赞（true为点赞，false为取消点赞）
     * @return 是否操作成功
     */
    boolean voteTopic(Long topicId, Long userId, boolean isUpvote);

    /**
     * 回复投票（点赞/取消点赞）
     * @param replyId 回复ID
     * @param userId 用户ID
     * @param isUpvote 是否点赞（true为点赞，false为取消点赞）
     * @return 是否操作成功
     */
    boolean voteReply(Long replyId, Long userId, boolean isUpvote);

    /**
     * 搜索话题
     * @param searchDTO 搜索条件
     * @return 话题分页
     */
    Page<TopicVO> searchTopics(ForumSearchDTO searchDTO);

    /**
     * 获取用户的话题列表
     * @param userId 用户ID
     * @param page 页码
     * @param size 每页大小
     * @return 话题分页
     */
    Page<TopicVO> getUserTopics(Long userId, Integer page, Integer size);

    /**
     * 获取用户的回复列表
     * @param userId 用户ID
     * @param page 页码
     * @param size 每页大小
     * @return 回复分页
     */
    Page<ReplyVO> getUserReplies(Long userId, Integer page, Integer size);

    /**
     * 设置话题为精华
     * @param topicId 话题ID
     * @param isEssence 是否设为精华
     * @param userId 操作用户ID（必须为管理员）
     * @return 是否操作成功
     */
    boolean setTopicEssence(Long topicId, boolean isEssence, Long userId);

    /**
     * 设置话题置顶
     * @param topicId 话题ID
     * @param isTop 是否置顶
     * @param userId 操作用户ID（必须为管理员）
     * @return 是否操作成功
     */
    boolean setTopicTop(Long topicId, boolean isTop, Long userId);
} 